package com.example.controller;

import com.example.domain.dto.cart.*;
import com.example.exception.ApiResponse;
import com.example.service.CartService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
 * 购物车管理Controller
 * 
 * <p>提供购物车的管理接口，包括：
 * <ul>
 *   <li>购物车创建与查询</li>
 *   <li>购物车商品管理</li>
 *   <li>购物车结算预览</li>
 *   <li>购物车清空</li>
 * </ul>
 * </p>
 * 
 * @author Means
 * @since 2025-10-28
 */
@Slf4j
@RestController
@RequestMapping("/api/carts")
@RequiredArgsConstructor
public class CartController {
    
    private final CartService cartService;
    
    // ==================== 购物车管理 ====================
    
    /**
     * 获取或创建购物车
     * 根据用户ID或会话ID获取活跃购物车，不存在则创建新购物车
     * 
     * @param userId 用户ID（可选）
     * @param sessionId 会话ID（必填）
     * @return 购物车DTO
     */
    @GetMapping("/current")
    public ApiResponse<CartDTO> getOrCreateCart(
            @RequestParam(required = false) String userId,
            @RequestParam String sessionId) {
        log.debug("获取或创建购物车: userId={}, sessionId={}", userId, sessionId);
        CartDTO cart = cartService.getOrCreateCart(userId, sessionId);
        return ApiResponse.success(cart);
    }
    
    /**
     * 根据ID获取购物车详情
     * 
     * @param cartId 购物车ID
     * @return 购物车DTO
     */
    @GetMapping("/{cartId}")
    public ApiResponse<CartDTO> getCart(@PathVariable String cartId) {
        log.debug("获取购物车详情: cartId={}", cartId);
        CartDTO cart = cartService.getCartById(cartId);
        return ApiResponse.success(cart);
    }
    
    /**
     * 根据用户获取活跃购物车
     * 
     * @param userId 用户ID
     * @return 购物车DTO
     */
    @GetMapping("/user/{userId}/active")
    public ApiResponse<CartDTO> getActiveCartByUser(@PathVariable String userId) {
        log.debug("根据用户获取活跃购物车: userId={}", userId);
        CartDTO cart = cartService.getActiveCartByUser(userId);
        return ApiResponse.success(cart);
    }
    
    /**
     * 清空购物车
     * 
     * @param cartId 购物车ID
     * @return 更新后的购物车DTO
     */
    @DeleteMapping("/{cartId}/items")
    public ApiResponse<CartDTO> clearCart(@PathVariable String cartId) {
        log.info("清空购物车: cartId={}", cartId);
        cartService.clearCart(cartId);
        CartDTO cart = cartService.getCartById(cartId);
        log.info("购物车清空成功: cartId={}", cartId);
        return ApiResponse.success(cart);
    }
    
    // ==================== 购物车商品管理 ====================
    
    /**
     * 添加商品到购物车
     * 
     * @param cartId 购物车ID
     * @param request 添加商品请求
     * @return 更新后的购物车DTO
     */
    @PostMapping("/{cartId}/items")
    public ApiResponse<CartDTO> addItemToCart(
            @PathVariable String cartId,
            @Valid @RequestBody AddToCartRequest request) {
        log.info("添加商品到购物车: cartId={}, productId={}, quantity={}", 
                cartId, request.getProductId(), request.getQuantity());
        CartDTO cart = cartService.addItemToCart(cartId, request);
        log.info("商品添加成功: cartId={}, itemCount={}", cartId, cart.getItems().size());
        return ApiResponse.success(cart);
    }
    
    /**
     * 更新购物车商品数量
     * 
     * @param cartId 购物车ID（路径参数，仅用于语义清晰）
     * @param itemId 购物车商品ID
     * @param request 更新请求
     * @return 更新后的购物车DTO
     */
    @PutMapping("/{cartId}/items/{itemId}")
    public ApiResponse<CartDTO> updateCartItem(
            @PathVariable String cartId,
            @PathVariable String itemId,
            @Valid @RequestBody UpdateCartItemRequest request) {
        log.info("更新购物车商品数量: cartId={}, itemId={}, quantity={}", 
                cartId, itemId, request.getQuantity());
        CartDTO cart = cartService.updateCartItem(itemId, request);
        log.info("购物车商品更新成功: cartId={}", cartId);
        return ApiResponse.success(cart);
    }
    
    /**
     * 从购物车删除商品
     * 
     * @param cartId 购物车ID（路径参数，仅用于语义清晰）
     * @param itemId 购物车商品ID
     * @return 更新后的购物车DTO
     */
    @DeleteMapping("/{cartId}/items/{itemId}")
    public ApiResponse<CartDTO> removeItemFromCart(
            @PathVariable String cartId,
            @PathVariable String itemId) {
        log.info("从购物车删除商品: cartId={}, itemId={}", cartId, itemId);
        CartDTO cart = cartService.removeItemFromCart(itemId);
        log.info("商品删除成功: cartId={}", cartId);
        return ApiResponse.success(cart);
    }
    
    // ==================== 购物车计算 ====================
    // 注：购物车的计算在每次商品增删改时自动触发，无需额外API
    
    // ==================== 购物车结算 ====================
    // 注：订单功能待开发，结算相关API暂未实现
    // TODO: 后续实现订单功能时，补充以下接口：
    //   - POST /api/carts/{cartId}/checkout - 结算购物车
    //   - GET /api/carts/{cartId}/validate - 验证购物车是否可结算
}

